package editorsvg.css;

import editorsvg.editor.documento.ElementoSVG;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Jorge
 */
public class Regla implements Comparable {    
    private List<Asignacion> asignaciones;    
    private Condicion condicion;
    private boolean soloImportantes;
    
    public Regla() {    
    }

    @Override
    public String toString() {
        return "Regla";
    }
   

    public List<Asignacion> getAsignaciones() {
        return asignaciones;
    }

    public void setAsignaciones(List<Asignacion> asignaciones) {
        this.asignaciones = asignaciones;
    }

    public Condicion getCondicion() {
        return condicion;
    }

    public void setCondicion(Condicion condicion) {
        this.condicion = condicion;
    }   

    public void evaluar(ElementoSVG elemento, boolean soloImportantes) {
        this.soloImportantes = soloImportantes;
        evaluar(condicion, elemento);
    }
    
    private void evaluar(Condicion condicion, ElementoSVG elemento) {
        
        condicion.evaluar(elemento, this);
        
        if (elemento.getHijos() == null) {
            return;
        }
        
        for (ElementoSVG hijo : elemento.getHijos()) {
            evaluar(condicion, hijo);
        }
    }

    /**
     * Obtiene la prioridad de la regla. Las reglas mas prioritarias (mas especficas) 
     * predominan sobre las menos prioritarias (mas genéricas).
     * La prioridad se obtiene sumando la prioridad de los selecctores de la regla css.
     */
    public int getEspecificidad() {
        return condicion.getEspecificidad();
    }

    @Override
    public int compareTo(Object o) {
        if (!(o instanceof Regla)) {
            return 1;
        }
        return getEspecificidad() - ((Regla) o).getEspecificidad();
    }
    
    public void aplicarAsignaciones(ElementoSVG elemento) {
        for (Asignacion asignacion : asignaciones) {
            asignacion.aplicar(elemento, soloImportantes);
        }
    }

}
